//代码得会自己写！！！！
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

void *client_thread(void *arg){
    int clientfd = *(int *)arg;
    char buffer[1024];
    while(recv(clientfd, buffer, sizeof(buffer), 0) > 0){
        printf("client say: %s", buffer);
    }
    close(clientfd);
}

// stdin:0
// stdout:1
// stderr:2
//tcp server
int main(){

    int sockfd = socket(AF_INET, SOCK_STREAM, 0);  //3

    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));

    server_addr.sin_family = AF_INET;
    //INADDR_ANY表示0.0.0.0,绑定所有可用的IP地址,lo回环常用于进程间通信
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    //1024以前端口是系统端口,不能绑定
    server_addr.sin_port = htons(8888);

    if(-1 == bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr))){
        perror("bind");
    }

    listen(sockfd, 10);

    //接收数据
    //定义一个客户端地址
    struct sockaddr_in client_addr;
    socklen_t client_addr_len = sizeof(client_addr);
    //程序阻塞等待客户端连接
    int clientfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_addr_len); 
    
    //创建线程
    pthread_t tid;
    pthread_create(&tid, NULL, client_thread, &clientfd);
    //pthread_join(tid, NULL);    //使用这个会堵塞主线程，导致无法同时处理多个客户端！！！！
    pthread_detach(tid);


    // char buffer[1024];
    // //第四个默认为0，也会阻塞等待数据
    // int count = recv(clientfd, buffer, sizeof(buffer), 0);
    // printf("count: %d", count);
    // printf("client say: %s", buffer);


    send(clientfd, "hello client", 12, 0);

    //关闭文件描述符，close中应该是包括协议的关闭的
    close(sockfd);
    //shutdown是关闭协议的一路流，tcp是双工通信，shutdown会关闭一路通信

    getchar();
}